package edu.eam.dao;

import edu.eam.modelo.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

/**
 * Clase que nos permitira hacer el acceso a los datos
 * de la BD, permite metodos para interactuar con la tabla
 * usuario
 * @author TecnoMakro
 *
 */
public class DAOUsuario {

    private Connection conex;

    /**
        * Constructor de la clase sin parametros
        */
    public DAOUsuario(Connection conex) {

            this.conex = conex;
    }

    /**
        * Metodo que nos permite ingresar a un usuario 
        * en la BD
        * @param usuario
        * @throws SQLException
        */
    public void crearUsuario(Usuario usuario) throws SQLException{

            String consulta = "INSERT INTO usuario(cedula, nickname, password, nombre_completo, telefono, " +
                            "estado, acceso) VALUES (?, ?, ?, ?,?, ?, ?)";

            PreparedStatement pstm = null;

            try {

                    pstm = conex.prepareStatement(consulta);
                    pstm.setString(1, usuario.getCedula());
                    pstm.setString(2, usuario.getNickName());
                    pstm.setString(3, usuario.getPassword());
                    pstm.setString(4, usuario.getNombreCompleto());
                    pstm.setString(5, usuario.getTelefono());
                    pstm.setInt(6, usuario.getEstado());
                    pstm.setInt(7, usuario.getAcceso());


                    pstm.executeUpdate();

            } finally {

                    if (pstm != null) {

                            pstm.close();
                    }
            }
    }

    /**
        * Metodo que nos permite buscar un usuario
        * @param cedula
        * @return Usuario que tiene ese numero de cedula
        * @throws SQLException
        */
    public Usuario buscarUsuario(String cedula) throws SQLException{

            String consulta = "SELECT nickname, password, nombre_completo, telefono, " +
                            "estado, acceso FROM usuario WHERE cedula = ?";

            PreparedStatement pstm = null;
            Usuario user = null;
            ResultSet res = null;

            try {

                    pstm = conex.prepareStatement(consulta);
                    pstm.setString(1, cedula);
                    res = pstm.executeQuery();

                    if (res.next()) {

                            String nickName = res.getString(1);
                            String password = res.getString(2);
                            String nombreCompleto = res.getString(3);
                            String telefono = res.getString(4);
                            int estado = res.getInt(5);
                            int acceso = res.getInt(6);

                            user = new Usuario(cedula,nombreCompleto, nickName, password, telefono, estado, acceso);
                    }

            } finally {

                    if (pstm != null) {

                            pstm.close();
                    }

                    if (res != null){

                            res.close();
                    }
            }

            return user;
    }


    /**
        * Metodo que nos permite poner en estado inactivo a un usuario
        * @param cedula
        * @throws SQLException
        * @return true si se afecto al menos una fila de la BD
        * false si no se afecta ninguna fila
        */
    public boolean inactivarUsuario(String cedula) throws SQLException {

            String consulta = "UPDATE usuario set estado = 0 WHERE cedula = " + cedula;

            PreparedStatement pstm = null;

            try {

                    pstm = conex.prepareStatement(consulta);				
                    if ( pstm.executeUpdate() == 1 ) { // Si se afecta al menos una fila
                    
                        return true;
                    }
                    
            } finally {
                    if (pstm != null) {
                            pstm.close();
                    }
            }
            
            return false;
    }


    /**
        * Metodo que nos permite saber si 
        * un usuarioq ue se intenatr loggear esta
        * en el sistema o no
        * @param nickName
        * @param password
        * @return
        * @throws SQLException 
        */
    public Map autenticarce (String nickName, String password) throws SQLException {

        Map<String, Object> result = new HashMap<String, Object>();
        
        String consulta = "SELECT acceso,estado FROM usuario WHERE password = ? and nickname = ?";
        int acceso = 2;// numero aleatorio que dice uqe no obtuvo valor
        int estado = 2;
        PreparedStatement pstm = null;
        ResultSet res = null;

        try {

            pstm = conex.prepareStatement(consulta);
            pstm.setString(1, password);
            pstm.setString(2, nickName);

            res = pstm.executeQuery();

            if (res.next()) {

                acceso = res.getInt(1);
                estado = res.getInt(2);
                result.put("acceso", acceso);
                result.put("existe", true);
                result.put("estado", estado);
            } else {
                
                result.put("acceso", null);
                result.put("existe", false);
            }

        } finally {
            
            pstm.close();
            res.close();
        }

        return result;
    }
    
    
    /**
     * Metodo que nos permite averiguar su el usuari
     * que se va a crear es valido es decir si este 
     * no se encuentra ya en base de datos esto lo sabremos 
     * comparando  la cedula de usuario
     * @param cedula
     * @return
     * @throws SQLException 
     */
    public boolean usuarioValidoCedula (String cedula) throws SQLException {
    
        String consulta = "SELECT nombre_completo FROM usuario WHERE cedula = ?";
        boolean resultado = false;
        PreparedStatement pstm = null;
        ResultSet res = null;

        try {

            pstm = conex.prepareStatement(consulta);
            pstm.setString(1, cedula);

            res = pstm.executeQuery();

            if (res.next()) {

               resultado = false;
            } else {
                
                resultado = true;
            }

        } finally {
            
            pstm.close();
            res.close();
        }
        
        return resultado;
    }
    
    /**
     * Metodo que nos permite averiguar su el usuari
     * que se va a crear es valido es decir si este 
     * no se encuentra ya en base de datos esto lo sabremos 
     * comparando el nick name 
     * @param nickName
     * @return
     * @throws SQLException 
     */
    public boolean usuarioValidoNickName (String nickName) throws SQLException {
    
        String consulta = "SELECT nombre_completo FROM usuario WHERE nickname = ?";
        boolean resultado = false;
        PreparedStatement pstm = null;
        ResultSet res = null;

        try {

            pstm = conex.prepareStatement(consulta);
            pstm.setString(1, nickName);

            res = pstm.executeQuery();

            if (res.next()) {

               resultado = false;
            } else {
                
                resultado = true;
            }

        } finally {
            
            pstm.close();
            res.close();
        }
        
        return resultado;
    }
    
    /**
     * Metodo que nos permite editar a un usuario
     * @param usuario
     * @throws SQLException 
     */
    public void editarUsuario (Usuario usuario) throws SQLException {
    
          String consulta = "UPDATE usuario set nickname = '" + usuario.getNickName() + "', nombre_completo = '" 
                  + usuario.getNombreCompleto() + "', telefono = '" + usuario.getTelefono() + "', password = '" 
                  + usuario.getPassword() + "', estado = " + usuario.getEstado() + ", acceso = " + usuario.getAcceso()
                  + " WHERE cedula = '" + usuario.getCedula() + "'";
          
          PreparedStatement pstm = null;
          
          try {
              
              pstm = conex.prepareStatement(consulta);
              pstm.executeUpdate();
              
          } finally {
          
              pstm.close();
          }
    }
}
